package com.uniquesoft.excelwriter;

import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;  
import java.util.Date;  
  
import org.apache.poi.hssf.usermodel.HSSFCell;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.poifs.filesystem.POIFSFileSystem;  
import org.apache.poi.ss.usermodel.RichTextString;

public class WriteExcelUtils { 
	    private String srcXlsPath = "";// // excel模板路径  
	    private String desXlsPath = "";  
	    private String sheetName = "";  
	    POIFSFileSystem fs = null;  
	    HSSFWorkbook wb = null;  
	    HSSFSheet sheet = null;  
	    public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy.mm");
	    /** 
	     * 第一步、设置excel模板路径 
	     * @param srcXlsPath 
	     */  
	    public void setSrcPath(String srcXlsPath) {  
	        this.srcXlsPath = srcXlsPath;  
	    }  
	  
	    /** 
	     * 第二步、设置要生成excel文件路径 
	     * @param desXlsPath 
	     */  
	    public void setDesPath(String desXlsPath) {  
	        this.desXlsPath = desXlsPath;  
	    }  
	  
	    /** 
	     * 第三步、设置模板中哪个Sheet列 
	     * @param sheetName 
	     */  
	    public void setSheetName(String sheetName) {  
	        this.sheetName = sheetName;  
	    }  
	  
	    /** 
	     * 第四步、获取所读取excel模板的对象 
	     */  
		public void createTemplateExcel() {
			// TODO Auto-generated method stub
			try {
	            File fi = new File(srcXlsPath);  
	            if(!fi.exists()){  
	                System.out.println("模板文件:"+srcXlsPath+"不存在!");
	            }  
	            fs = new POIFSFileSystem(new FileInputStream(fi));  
	            wb = new HSSFWorkbook(fs); 
			} catch (FileNotFoundException e) {
				// TODO: handle exception
				System.out.println("文件操作异常");
				e.printStackTrace();
			}catch (IOException e) {  
	            e.printStackTrace();  
	        }
			
		}
	    public HSSFSheet getSheet() {  
	            sheet = wb.getSheet(sheetName);  
			return sheet;  
	    }  
	  
	    /** 
	     * 第五步、设置字符串类型的数据 
	     * @param rowIndex--行值 
	     * @param cellnum--列值 
	     * @param value--字符串类型的数据 
	     */  
	    public void setCellStrValue(int rowIndex, int cellnum, String value) {  
	        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
	        cell.setCellValue(value);  
	    }  
	  
	    /** 
	     * 第五步、设置日期/时间类型的数据 
	     * @param rowIndex--行值 
	     * @param cellnum--列值 
	     * @param value--日期/时间类型的数据 
	     */  
	    public void setCellDateValue(int rowIndex, int cellnum, Date value) {  
	        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
	        cell.setCellValue(value);  
	    }  
	  
	    /** 
	     * 第五步、设置浮点类型的数据 
	     * @param rowIndex--行值 
	     * @param cellnum--列值 
	     * @param value--浮点类型的数据 
	     */  
	    public void setCellDoubleValue(int rowIndex, int cellnum, double value) {  
	        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
	        cell.setCellValue(value);  
	    }  
	  
	    /** 
	     * 第五步、设置Bool类型的数据 
	     * @param rowIndex--行值 
	     * @param cellnum--列值 
	     * @param value--Bool类型的数据 
	     */  
	    public void setCellBoolValue(int rowIndex, int cellnum, boolean value) {  
	        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
	        cell.setCellValue(value);  
	    }  
	  
	    /** 
	     * 第五步、设置日历类型的数据 
	     * @param rowIndex--行值 
	     * @param cellnum--列值 
	     * @param value--日历类型的数据 
	     */  
	    public void setCellCalendarValue(int rowIndex, int cellnum, Calendar value) {  
	        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
	        cell.setCellValue(value);  
	    }  
	  
	    /** 
	     * 第五步、设置富文本字符串类型的数据。可以为同一个单元格内的字符串的不同部分设置不同的字体、颜色、下划线 
	     * @param rowIndex--行值 
	     * @param cellnum--列值 
	     * @param value--富文本字符串类型的数据 
	     */  
	    public void setCellRichTextStrValue(int rowIndex, int cellnum,  
	            RichTextString value) {  
	        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
	        cell.setCellValue(value);  
	    }  
	  
	    /** 
	     * 第六步、完成导出 
	     */  
	    public void exportToNewFile() {  
	        FileOutputStream out;  
	        try {  
	            out = new FileOutputStream(desXlsPath);  
	            System.out.println("目标文件路径："+desXlsPath);
	            wb.write(out); 
	            System.out.println("写文件完成");
	            out.close();  
	        } catch (FileNotFoundException e) {  
	            e.printStackTrace();  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        }  
	    }  
	    
	    /**
	     * @param baseSheet
	     * @param key
	     * @return
	     */
	    public int getRowIndex(String key ){
	    	if (sheetName == "第一页"){
	    		return Sheet1.sheetFormat.get(key).getFirstRow();	
	    	}else {
	    		return Sheet2.sheetFormat.get(key).getFirstRow(); //此处仍需完善
			}
			
	    }
	    
	    /**
	     * @param baseSheet
	     * @param key
	     * @return
	     */
	    public int getCellIndex(String key ){
	    	if (sheetName == "第一页"){
	    		return Sheet1.sheetFormat.get(key).getFirstColumn();	
	    	}else {
	    		return Sheet2.sheetFormat.get(key).getFirstColumn(); //此处仍需完善
			}
	    }
	    
	    public String getStringFromDate(Date date){
	    	if (date !=null){
	    		String dateString = sdf.format(date);
	    		return dateString;
	    	}else{
	    		return null;
	    	}
	    	
	    }
        
	    public void setDataToSheet(BaseSheet bs){
	    	try {
				//判断该sheet类型是否是Sheet1类型
	    		if ((bs) instanceof Sheet1){
	    			System.out.println("该sheet是sheet1 类型");
					Sheet1 sheet1 = (Sheet1) bs;
					sheetName = "第一页";//如果sheetname 变了的话，此处需要修改
					getSheet();
					System.out.println("sheet1.name="+sheet1.getName());
					System.out.println("当前sheet名字："+sheet.getSheetName());
			        setCellStrValue(getRowIndex("name"), getCellIndex("name"), sheet1.getName());
			        setCellStrValue(getRowIndex("gender"), getCellIndex("gender"), sheet1.getGender());
			        setCellStrValue(getRowIndex("birthday"), getCellIndex("birthday"), getStringFromDate(sheet1.getBirthday()));
			        setCellStrValue(getRowIndex("age"), getCellIndex("age"), sheet1.getAge());
			        setCellStrValue(getRowIndex("nationality"), getCellIndex("nationality"), sheet1.getNationality());
			        setCellStrValue(getRowIndex("province"), getCellIndex("province"), sheet1.getProvince());
			        setCellStrValue(getRowIndex("birthPlace"), getCellIndex("birthPlace"), sheet1.getBirthPlace());
			        setCellStrValue(getRowIndex("photo"), getCellIndex("photo"), sheet1.getPhoto());
			        setCellStrValue(getRowIndex("initiate"), getCellIndex("initiate"), getStringFromDate(sheet1.getInitiate()));
			        setCellStrValue(getRowIndex("workFromDate"), getCellIndex("workFromDate"), getStringFromDate(sheet1.getWorkFromDate()));
			        setCellStrValue(getRowIndex("health"), getCellIndex("health"), sheet1.getHealth());
			        setCellStrValue(getRowIndex("professionalPosition"), getCellIndex("professionalPosition"), sheet1.getProfessionalPosition());
			        setCellStrValue(getRowIndex("talent"), getCellIndex("talent"), sheet1.getTalent());
			        if (sheet1.isFullEdu()){
			            setCellStrValue(getRowIndex("fullEdu"), getCellIndex("fullEdu"), sheet1.getFullEdu());
			            setCellStrValue(getRowIndex("fullEduSchool"), getCellIndex("fullEduSchool"), sheet1.getFullEduSchool());    
			            setCellStrValue(getRowIndex("fullEduMajor"), getCellIndex("fullEduMajor"), sheet1.getFullEduMajor());   
			        }else{
			            setCellStrValue(getRowIndex("workingEdu"), getCellIndex("workingEdu"), sheet1.getWorkingEdu());
			            setCellStrValue(getRowIndex("workingEduSchool"), getCellIndex("workingEduSchool"), sheet1.getWorkingEduSchool());
			            setCellStrValue(getRowIndex("workingEduMajor"), getCellIndex("workingEduMajor"), sheet1.getWorkingEduMajor());
			        }
			        setCellStrValue(getRowIndex("c_post"), getCellIndex("c_post"), sheet1.getC_post());
			        setCellStrValue(getRowIndex("a_post"), getCellIndex("a_post"), sheet1.getA_post());
			        setCellStrValue(getRowIndex("f_post"), getCellIndex("f_post"), sheet1.getF_post());
			        setCellStrValue(getRowIndex("resume"), getCellIndex("resume"), sheet1.getResume());
				}
	    		else if (bs instanceof Sheet2){  //判断该sheet类型是否是sheet2类型
					System.out.println("该sheet是sheet2 类型");
					Sheet2 sheet2 =  (Sheet2) bs;
					sheetName = "第二页"; //如果sheetname 变了的话，此处需要修改
					getSheet();
					setCellStrValue(getRowIndex("rewards"), getCellIndex("rewards"), sheet2.getRewards());
			        setCellStrValue(getRowIndex("annualAppraisal"), getCellIndex("annualAppraisal"), sheet2.getAnnualAppraisal());
			        setCellStrValue(getRowIndex("removalReason"), getCellIndex("removalReason"), sheet2.getRemovalReason());
			        setCellStrValue(getRowIndex("applicant"), getCellIndex("applicant"), sheet2.getApplicant());
			        for (int i = 0; i < sheet2.getFamilyMembers().size(); i++){
			            setCellStrValue(getRowIndex("called")+i, getCellIndex("called"), sheet2.getFamilyMembers().get(i).called);
			            setCellStrValue(getRowIndex("familyName")+i, getCellIndex("familyName"), sheet2.getFamilyMembers().get(i).familyName);
			            setCellStrValue(getRowIndex("familyBirthDate")+i, getCellIndex("familyBirthDate"), getStringFromDate(sheet2.getFamilyMembers().get(i).familyBirthDate));
			            setCellStrValue(getRowIndex("familyPoliticalStatus")+i, getCellIndex("familyPoliticalStatus"), sheet2.getFamilyMembers().get(i).familyPoliticalStatus);
			            setCellStrValue(getRowIndex("familyComPos")+i, getCellIndex("familyComPos"), sheet2.getFamilyMembers().get(i).familyComPos);
			        }
				}else {
					throw new Exception("该表格下的sheet模板不存在");
				}
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
	    }
	    /**
	     * @param wbs  //workbook 数组
	     * @param srcXlsPath // 源表格模板路径
	     * @param desXlsPath //目标表格路径
	     */
	    public void writeExcel(AppravalFormWB afwb, String srcPath , String desPath ){
	    	try {
				if (afwb !=null){
					BaseSheet[] bs = afwb.getSheets();
					//第一步：设置Excel模板路径
					System.out.println("第一步：设置Excel模板路径");
					setSrcPath(srcPath);
					System.out.println("源文件路径："+srcPath);
					//第二步： 根据模板表格创建workbook
					System.out.println("第二步： 根据模板表格创建workbook");
					createTemplateExcel();
					//第三步： 设置生成Excel文件路径
					System.out.println("第三步： 设置生成Excel文件路径");
					setDesPath(desPath);
					System.out.println("设置目标文件路径完成》》》》》》》》");
					//第四步： 设置模板中的sheetname
					//第五步： 设置模板中sheet的数据
					System.out.println("第四步： 设置生成Excel文件路径 ；第五步： 设置模板中sheet的数据");
					if(bs != null && bs.length >0){
						for (int i = 0; i < bs.length ; i++){
								setDataToSheet(bs[i]);
						}
					}
					//第六步： 完成导出
					System.out.println("第六步： 完成导出");
					exportToNewFile();
				}
				else {
					throw new Exception("请先构造您要初始化的表格数据");
				}
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
				System.out.println(e.getMessage());
			}
	    }
}
